package main

import (
	"fmt"
	"sort"
	"strconv"
	"strings"
)

func main() {
	// var a int
	// fmt.Scan(&a)
	// fmt.Printf("%s", "hello world")

	n := "23121"
	nums := []int{2, 4, 9}
	println(generateValue(n, nums))

}

func generateValue(n string, nums []int) string {
	// 从前往后遍历，如果确定后面的位无论如何排列都比之前小，那就直接插入最大的值
	numStack := make([]int, len(n))

	nums = sort.IntSlice(nums)
	numsLen := len(nums)

	nArray := strings.Split(n, "")

	// 确定是否可以塞入最大值
	flag := false

	for idx, str := range nArray { // 我需要插入小于等于它的值
		if flag {
			numStack[idx] = nums[numsLen-1]
			continue
		}
		for i := numsLen - 1; i >= 0; i-- {
			// 找到第一个可以插入的比当前位小的最大值
			strValue, _ := strconv.Atoi(str)
			if nums[i] < strValue { // 插入，后序都可以塞最大值
				numStack[idx] = nums[i]
				flag = true
			} else if nums[i] == strValue { // 插入，后序还要判定
				numStack[idx] = nums[i]
			}
		}
		// 还有其他情况，
	}

	var resStr string
	for _, stack := range numStack {
		resStr = fmt.Sprintf("%v%v", resStr, stack)
	}

	return resStr
}
